package persistencia;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import javax.persistence.Query;

import modelo.datos.Direccion;
import modelo.datos.Empresa;
import modelo.datos.Entrada;
import modelo.datos.Persona;
import modelo.datos.Telefono;
import modelo.datos.utils.ListaEntradas;
import es.uji.www.GeneradorDatosINE;

public class BaseDatosGestorImpl implements BaseDatos {
	private static final int NUMERO_ENTRADAS = 3;
	private EntityManagerFactory emf;
	private EntityManager em;
	private EntityTransaction tx;

	public BaseDatosGestorImpl() {
		super();
		emf = Persistence.createEntityManagerFactory("ejemplo");
		em = emf.createEntityManager();
		tx = em.getTransaction();
		iniciaDatos();
	}

	private void iniciaDatos() {
		String nombre;
		String apellidos;
		String nif;
		String poblacion;
		String provincia;
		GeneradorDatosINE generador = new GeneradorDatosINE();
		List<Telefono> telefonos = new ArrayList<>();
		Telefono telefono = new Telefono((short)964, 555555);
		telefonos.add(telefono);
		tx.begin();
		nuevaEntrada(new Persona("Oscar", "Belmonte", "123", 
				new Direccion("Castellón", "Castellón de la Plana"), 
				telefonos));
		telefonos = new ArrayList<>();
		telefono = new Telefono((short)964, 444444);
		nuevaEntrada(new Empresa("UJI", "321", 
				new Direccion("Castellón", "Castellón de la Plana"), 
				telefonos));
		for (int i = 0; i < NUMERO_ENTRADAS; i++) {
			nombre = generador.getNombre();
			apellidos = generador.getApellido() + " " + generador.getApellido();
			nif = generador.getNIF();
			provincia = generador.getProvincia();
			poblacion = generador.getPoblacion(provincia);
			telefonos = new ArrayList<>();
			telefono = new Telefono((short)(Math.random()*100), 
					(int)(Math.random()*1000000));
			telefonos.add(telefono);
			nuevaEntrada(new Persona(nombre, apellidos, nif, 
					new Direccion(provincia, poblacion), telefonos));
			nombre = generador.getNombre();
			nif = generador.getNIF();
			provincia = generador.getProvincia();
			poblacion = generador.getPoblacion(provincia);
			telefonos = new ArrayList<>();
			telefono = new Telefono((short)(Math.random()*100), 
					(int)(Math.random()*1000000));
			telefonos.add(telefono);
			telefono = new Telefono((short)(Math.random()*100), 
					(int)(Math.random()*1000000));
			telefonos.add(telefono);
			nuevaEntrada(new Empresa(nombre, nif, 
					new Direccion(provincia, poblacion), telefonos));
		}
		tx.commit();
	}

	@SuppressWarnings("unchecked")
	public ListaEntradas getEntradas() {
//		Query query = em.createNamedQuery(Entrada.RECUPERA_TODAS);
//		List<Entrada> entradas = query.getResultList();
//		return new ListaEntradas(entradas);
		return null;
	}

	@SuppressWarnings("unchecked")
	public Entrada buscaEntradaPorNIF(String nif) {
//		Query query = em.createNamedQuery(Entrada.RECUPERA_POR_NIF);
//		query.setParameter("nif", nif);
//		List<Entrada> entradas = query.getResultList();
//		if(entradas.isEmpty() == false)
//			return entradas.get(0);
//		else return BaseDatos.ENTRADA_NULL;
		return null;
	}

	@Override
	public void nuevaEntrada(Entrada entrada) {
		em.persist(entrada);
	}

	@Override
	public boolean actualizaEntrada(Entrada entrada) {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public boolean borraEntrada(String nif) {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public Date getUltimaModificacion() {
		// TODO Auto-generated method stub
		return null;
	}
}
